﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Box.Entities;
namespace Box.Repository
{
    public class CompraRepository : MasterRepository, ICompraRepository
    {

        public List<Compra> GetAllFromCompras()
        {
            var query = from c in Context.Compras
                        .Include("Proveedor")
                        .Include("TipoDocumento")
                        .Include("DetalleCompras.Insumo")
                        select c;
            return query.ToList();
        }

        public List<Compra> GetFromComprasByCriterio(string criterio)
        {
            var query = (from c in Context.Compras
                        .Include("Proveedor")
                         where c.EstadoCompra != "Anulada"
                        select c);

            if (criterio != null && criterio != string.Empty)
            {
                query = query.Where(c=>c.Proveedor.NombreEmpresa.ToUpper().Contains(criterio.ToUpper()) 
                                    || c.Proveedor.PropietarioEmpresa.Equals(criterio.ToUpper()) && c.EstadoCompra != "Anulada");
            }
            return query.ToList();
        }

        public Compra GetFromComprasById(int id)
        {
            var query = from p in Context.Compras
                        .Include("Proveedor")
                        .Include("DetalleCompras.Insumo")
                        where p.Id.Equals(id)
                        select p;
            return query.SingleOrDefault();
        }

        public void AddCompra(Compra compra)
        {
            Context.Entry(compra.Proveedor).State = EntityState.Unchanged;
            compra.DetalleCompras.ForEach(i => Context.Entry(i.Insumo).State = EntityState.Unchanged);
            Context.Compras.Add(compra);
            Context.SaveChanges();
        }

        public void UpdateCompra(Compra compra)
        {
            //var estadoDetalle = Context.ChangeTracker.Entries<DetalleCompra>();

            //Context.Entry(compra.Proveedor).State = EntityState.Unchanged;
            //Context.Entry(compra).State = EntityState.Modified;

            //foreach (var item in compra.DetalleCompras)
            //{

            //    //Context.Entry(item).State = item.Item == Int32.Parse("0") ?
            //    //    EntityState.Added : EntityState.Detached;

            //    item.IdInsumo = item.Insumo.Id;
            //    Context.Entry(item.Insumo).State = EntityState.Detached;
            //}
            //Context.SaveChanges();

            var compraDB = GetFromComprasById(compra.Id);

            compraDB.EstadoCompra = compra.EstadoCompra;
            compraDB.ImagenDocumento = compra.ImagenDocumento;
            compraDB.NumDocumento = compra.NumDocumento;
            compraDB.IdTipoDocumento = compra.IdTipoDocumento;
            compraDB.FechaCompra = compra.FechaCompra;
            compraDB.TipoPago = compra.TipoPago;
            compraDB.IdProveedor = compra.IdProveedor;
            
            var nuevos = compra.DetalleCompras.Except(compraDB.DetalleCompras).ToList();
            var eliminados = compraDB.DetalleCompras.Except(compra.DetalleCompras).ToList();
            var modificados = compra.DetalleCompras.Intersect(compraDB.DetalleCompras).ToList();

            eliminados.ForEach(e => compraDB.DetalleCompras.Remove(e));

            nuevos.ForEach(n =>
            {
                Context.Entry(n.Insumo).State = EntityState.Unchanged;
                compraDB.DetalleCompras.Add(n);
            });

            foreach (var item in modificados)
            {
                var itemDb = compraDB.DetalleCompras.SingleOrDefault(i => i.IdInsumo.Equals(item.IdInsumo));

                itemDb.Cantidad = item.Cantidad;
                itemDb.PrecioUnit = item.PrecioUnit;
                //itemDb.Monto = item.Monto;

                Context.Entry(itemDb).State = EntityState.Modified;
                Context.Entry(itemDb.Insumo).State = EntityState.Unchanged;

            }

            Context.Entry(compraDB).State = EntityState.Modified;

            Context.SaveChanges();

        }

        public void RemoveCompra(int id)
        {
            var existe = Context.Compras.Find(id);
            if (existe != null)
            {
                Context.Entry(existe).State = EntityState.Modified;
                existe.EstadoCompra = "Anulada";
                Context.SaveChanges();
            }

        }

        public bool ExisteCompra(int id)
        {
            var query = Context.Compras.Where(p => p.Id.Equals(id));

            return query.Any();
        }


        public List<Compra> FindSearchingFromComprasByTipoPago(string tipoPago)
        {
            var query = (from c in Context.Compras
                .Include("Proveedor")
                where c.TipoPago.Equals("A Credito")
                orderby c.FechaCompra descending
                select c).Take(50);

            if (!string.IsNullOrEmpty(tipoPago))
            {
                query = from p in query
                        where p.Proveedor.NombreEmpresa.ToUpper().Contains(tipoPago.ToUpper())
                        orderby p.FechaCompra descending
                        select p;
            }

            return query.ToList();

        }


        public List<Compra> GetFRomComprasAnuladadByCriterio(string criterio)
        {
            var query = from p in Context.Compras
            .Include("Proveedor")
                        where p.EstadoCompra == "Anulada"
                        select p;
            if (criterio != null && criterio != string.Empty)
            {
                query = from p in query
            .Include("Proveedor")
                        where p.Proveedor.NombreEmpresa.ToUpper().Contains(criterio.ToUpper())
                        && p.EstadoCompra == "Anulada"
                        select p;
            }
            return query.ToList();

        }
    }
}
